package org.example.scoresystem_backen.dto;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

/**
 * 分页请求DTO
 * 用于接收前端分页查询参数
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageRequest {

    /**
     * 页码，从1开始
     */
    private Integer page = 1;

    /**
     * 每页条数，默认10条，最大100条
     */
    private Integer pageSize = 10;

    /**
     * 搜索关键词（按学号或姓名模糊查询）
     */
    private String search;

    /**
     * 班级ID过滤
     */
    private Integer classId;

    /**
     * 课程ID过滤
     */
    private Integer courseId;

    /**
     * 课程名称搜索（用于课程管理）
     */
    private String courseName;

    /**
     * 课程代码搜索（用于课程管理）
     */
    private String courseCode;

    /**
     * 学分筛选（用于课程管理）
     */
    private java.math.BigDecimal credits;

    /**
     * 验证并修正分页参数
     */
    public void validate() {
        if (page == null || page < 1) {
            page = 1;
        }
        if (pageSize == null || pageSize < 1) {
            pageSize = 10;
        }
        if (pageSize > 100) {
            pageSize = 100;
        }
    }

    /**
     * 获取MySQL LIMIT的offset值
     * @return offset值
     */
    public Integer getOffset() {
        validate();
        return (page - 1) * pageSize;
    }

    /**
     * 获取MySQL LIMIT的limit值
     * @return limit值
     */
    public Integer getLimit() {
        validate();
        return pageSize;
    }

    /**
     * 获取页码
     * @return 页码
     */
    public Integer getPage() {
        return page;
    }

    /**
     * 设置页码
     * @param page 页码
     */
    public void setPage(Integer page) {
        this.page = page;
    }

    /**
     * 获取每页条数
     * @return 每页条数
     */
    public Integer getPageSize() {
        return pageSize;
    }

    /**
     * 设置每页条数
     * @param pageSize 每页条数
     */
    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    /**
     * 获取搜索关键词
     * @return 搜索关键词
     */
    public String getSearch() {
        return search;
    }

    /**
     * 设置搜索关键词
     * @param search 搜索关键词
     */
    public void setSearch(String search) {
        this.search = search;
    }

    /**
     * 获取班级ID
     * @return 班级ID
     */
    public Integer getClassId() {
        return classId;
    }

    /**
     * 设置班级ID
     * @param classId 班级ID
     */
    public void setClassId(Integer classId) {
        this.classId = classId;
    }

    /**
     * 获取课程ID
     * @return 课程ID
     */
    public Integer getCourseId() {
        return courseId;
    }

    /**
     * 设置课程ID
     * @param courseId 课程ID
     */
    public void setCourseId(Integer courseId) {
        this.courseId = courseId;
    }

    /**
     * 判断是否有搜索条件
     * @return 是否有搜索条件
     */
    public boolean hasSearch() {
        return search != null && !search.trim().isEmpty();
    }

    /**
     * 获取处理后的搜索关键词
     * @return 处理后的搜索关键词
     */
    public String getProcessedSearch() {
        if (!hasSearch()) {
            return null;
        }
        return "%" + search.trim() + "%";
    }

    /**
     * 判断是否有班级过滤条件
     * @return 是否有班级过滤条件
     */
    public boolean hasClassFilter() {
        return classId != null && classId > 0;
    }

    /**
     * 判断是否有课程过滤条件
     * @return 是否有课程过滤条件
     */
    public boolean hasCourseFilter() {
        return courseId != null && courseId > 0;
    }

    /**
     * 判断是否有课程名称搜索条件
     * @return 是否有课程名称搜索条件
     */
    public boolean hasCourseNameSearch() {
        return courseName != null && !courseName.trim().isEmpty();
    }

    /**
     * 判断是否有课程代码搜索条件
     * @return 是否有课程代码搜索条件
     */
    public boolean hasCourseCodeSearch() {
        return courseCode != null && !courseCode.trim().isEmpty();
    }

    /**
     * 判断是否有学分筛选条件
     * @return 是否有学分筛选条件
     */
    public boolean hasCreditsFilter() {
        return credits != null && credits.compareTo(java.math.BigDecimal.ZERO) > 0;
    }

    /**
     * 获取处理后的课程名称搜索关键词
     * @return 处理后的课程名称搜索关键词
     */
    public String getProcessedCourseName() {
        if (!hasCourseNameSearch()) {
            return null;
        }
        return "%" + courseName.trim() + "%";
    }

    /**
     * 获取处理后的课程代码搜索关键词
     * @return 处理后的课程代码搜索关键词
     */
    public String getProcessedCourseCode() {
        if (!hasCourseCodeSearch()) {
            return null;
        }
        return "%" + courseCode.trim() + "%";
    }
}
